import java.util.Arrays;
import java.util.Iterator;
import java.util.function.Consumer;
import java.util.stream.IntStream;

/**
 * 动态数组
 * 自己实现
 * @author 86155
 * @date 2023/10/21
 */
public class DynamicArray implements Iterable<Integer>{
    private int size = 0; //逻辑大小
    private int capacity = 8; //容量
    private int[] array = {};

    //加入数到数组最后
    public void addLast(int element) {
//        array[size] = element;
//        size++;
        add(size,element);
    }

    //向索引位置插入值
    public void add(int index, int element) {
        checkAndGrow();
        if (index < 0 || index > size) {
            throw new RuntimeException("数组大小越界");
        }else if (index >= 0 && index < size) {
            //系统拷贝方法,数组内元素的移动
            System.arraycopy(array,index,array,index+1,size - index);
        }
        array[index] = element;
        size++;
    }

    private void checkAndGrow() {
        // capacity: check it ,
        if (size == 0) {
            array = new int[capacity];
        }else if (size == capacity) {
            // should expanse array, 1.5
            capacity = capacity + capacity >> 1;
            int[] newArray = new int[capacity];
            System.arraycopy(array,0,newArray,0,size);
            array = newArray;
        }
    }

    public int get(int index) {
        return array[index];
    }

    //提供一个函数时接口
    //提供array[i]f
    //返回 void
    public void foreach(Consumer<Integer> consumer) {
        for (int i = 0; i < size; i++) {
            consumer.accept(array[i]);
        }
    }

    //迭代器遍历
    //实现接口，然后实现接口的方法
    @Override
    public Iterator<Integer> iterator() {

        return new Iterator<Integer>() {
            int i = 0;
            @Override
            public boolean hasNext() { //去询问有没有下一个元素
                return i < size;
            }

            @Override
            public Integer next() { //返回当前元素，并移动到下一个元素
                return array[i++]; // 这里是后++,先返回了i，然后再自增
            }
        };
    }

    public IntStream stream() {
        return IntStream.of(Arrays.copyOfRange(array,0,size));
    }

    //删除元素
    public int remove(int index) {
        int removed = array[index];
        if(index < size - 1) {
            System.arraycopy(array, index + 1, array, index, size - index - 1);
        }
        size--;
        return removed;
    }
}
